/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hibernate;


import beans.Nodo;
import beans.Pareja;
import beans.Arbol;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.List;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.collection.PersistentSet;

/**
 *
 * @author Antonio
 */
public class ParejaBD extends PreparacionHibernate {

    private Pareja pareja;

    /**Constructor de la clase*/
    public ParejaBD(Pareja pareja) {
        this.pareja = pareja;
    }
    
    /**Metodos observadores y modificadores de la clase*/
    public Pareja getPareja() {
        return pareja;
    }
     public void setPareja(Pareja pareja) {
        this.pareja = pareja;
    }
    

/**Metodo anadirComponente2: recupera la pareja de la base de datos y le asigna 
 * componente2
 * @param  Nodo: componente2 de la pareja
 */
    public void anadirComponente2(Nodo madre) {
        Session s = getSesion();
        Transaction trans = s.beginTransaction();
        
        Pareja padres = (Pareja)s.load(Pareja.class, pareja.getIdPareja());
        padres.setComponente2(madre);
        
        trans.commit();
        s.close();
    }
    /**Metodo anadirComponente1: recupera la pareja de la base de datos y le asigna 
 * componente1
 * @param  Nodo: componente1 de la pareja
 */
    public void anadirComponente1(Nodo padre) {
        Session s = getSesion();
        Transaction trans = s.beginTransaction();
        
        Pareja padres = (Pareja)s.load(Pareja.class, pareja.getIdPareja());
        padres.setComponente1(padre);
        
        trans.commit();
        s.close();
    }
    /**Metodo anadirHijo: recupera la pareja de la base de datos y le añade un hijo.
     * @param Nodo: hijo que se le va  a añadir.
     */
    public void anadirHijo(Nodo hijo) {
        Session s = getSesion();
        Transaction trans = s.beginTransaction();
        
        Pareja padres = (Pareja)s.load(Pareja.class, pareja.getIdPareja());
        padres.addHijos(hijo);
        
        trans.commit();
        s.close();
    }

    /**Metodo creaPareja : metodo que actualiza la base de datos ante la creacion
     * de una nueva pareja del nodo actual.
     * @param Nodo: nodo actual que se esta tratando.
     * @param Nodo: pareja del nodo actual
     */
    public void creaPareja(Nodo nodoActual, Nodo nodoPareja) {
        
        Session sesion = getSesion();
        Transaction trans = sesion.beginTransaction();
        
        //Crea una nueva pareja
        Pareja par = new Pareja();
        //Recupera el arbol de la base de datos a partir del id del nodoActual
        Arbol arbol = (Arbol)sesion.load(Arbol.class, nodoActual.getArbol().getIdArbol());
                
        //Recupera el nodo de la base de datos a partir del id del nodo actual
        Nodo nodo = (Nodo)sesion.load(Nodo.class, nodoActual.getIdNodo());
        //Establece la pareja
        par.setComponente1(nodo);
        par.setComponente2(nodoPareja);
        //Añade al arbol el nuevo nodo (pareja del nodo actual)
        arbol.addNodo(nodoPareja);
        //Añade al nodo actual y al nodo pareja una nueva pareja
        nodo.addPareja(par);
        nodoPareja.addPareja(par);
                
        trans.commit();
        sesion.close();
        
    }

    /**Metodo recuperarPreja: recupera la pareja de la base de datos a traves 
     * del id pareja de atributo pareja
     * @return Pareja: pareja tal como esta en la base de datos
     */
    public Pareja recuperarPareja() {
        
        long idPareja = pareja.getIdPareja();
        String query = "From Pareja WHERE idPareja = :idPareja";
        Hashtable<String,Object> ht = new Hashtable<String, Object>();
        ht.put("idPareja", idPareja);
        try{
        
            pareja = (Pareja)devuelveDatos(query, ht).get(0);
        }
        catch(NullPointerException ne)
        {
            
        }
        return pareja;
                
    }

   /**Metodo devuelveHijos: devuelve los hijos que estan en la base de datos 
    * de la pareja atributo
    * @return Set : hijos de la pareja
    */
    public Set devuelveHijos()
    {
        String query = "FROM Nodo WHERE idPadres = :pareja ORDER BY fechaNacimiento";
        Hashtable<String,Object> hashtable = new Hashtable<String, Object>();
        hashtable.put("pareja", pareja.getIdPareja());
        
        List<Object> lista = devuelveDatos(query, hashtable);
        Set hijos = new HashSet();
        hijos.addAll (lista);
        return hijos;
    }
    
    /**Metodo insertaHijos: añade un hijo a la pareja en la base de datos
     * @param Nodo: hijo que queremos añadir
     */
    public void insertaHijos(Nodo hijo)
    {
        Session sesion = getSesion();
        Transaction trans = sesion.beginTransaction();
        
        Pareja parejaAux = (Pareja)sesion.load(Pareja.class, pareja.getIdPareja());
        parejaAux.addHijos(hijo);
         
        trans.commit();
        sesion.close();               
    }
    /**Metodo anadir: añade la pareja atributo en la base de datos.
     */
    public void anadir()
    {
        anadirEnBD(pareja);
    }
}
